#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <cstdlib>
#include <cstdio>
#include <cstring>

#include "log.hpp"
#include "sharedM.hpp"
using namespace std;


int main() {
    logger log;
    log.setScreenPrint();
    sharedMem shm;
    // 创建共享内存
    int shmid = shm.creatShm(4096);
    log(INFO, "create shm success, shmid = %d", shmid);
    // 挂接到当前进程
    char* addr = (char*)shm.setShmat(shmid);
    log(INFO, "setShmat success, addr = %p", addr);
    // 使用
    while(1) {
        cout << "process sent a msg: ";
        ssize_t n = read(0, addr, 4096);
        if(n <= 0) {
            log(WARNING, "read end of file");
            break;
        }
        addr[n - 1] = 0;
        sleep(1);
    }
    // 取消挂接
    shm.setShmdt(addr);
    log(WARNING, "setShmdt success");
    // 释放空间(如果没有进程挂接)
    shm.ctrlShm(shmid, IPC_RMID);
    log(WARNING, "free addr if not be attach");
    return 0;
}

//int main() {
//    if(mkfifo(FIFOPATH, 0666) == -1) {
//        perror("mkfifo err");
//        exit(-1);
//    }
//    int fd = open(FIFOPATH, O_WRONLY | O_TRUNC);
//    if(fd == -1) {
//        perror("open err");
//        exit(-1);
//    }
//    char msg[] = "i am process A";
//    ssize_t n = write(fd, msg, sizeof(msg));
//    if(n == -1) {
//        perror("write err");
//        exit(-1);
//    }
//    cout << "i am process A and sent a msg to process B" << endl;
//    return 0;
//}

//int main() {
//    // 父进程写 子进程读
//    int fds[2];
//    if(pipe(fds) == -1) {
//        perror("pipe err");
//        exit(-1);
//    }
//    pid_t id = fork();
//    if(id <= 0) {
//        if(id == -1) {
//            perror("fork err");
//            exit(-1);
//        }
//        // child process
//        close(fds[1]);
//        if(dup2(fds[0], 0) == -1) {
//            perror("dup2 err");
//            exit(-1);
//        }
//        close(fds[0]);
//        char buff[1024]{};
//        ssize_t n = read(0, buff, sizeof(buff));
//        if(n <= 0) {
//            if(n == -1) {
//                perror("read err");
//            }
//            else {
//                printf("read end of file\n");
//            }
//            exit(errno);
//        }
//        buff[n] = 0;
//        cout << "get a msg from father: " << buff << endl;
//        exit(0);
//    }
//    // father process
//    close(fds[0]);
//    string msg = "i am father";
//    ssize_t n = write(fds[1], msg.c_str(), msg.size());
//    if(n == -1) {
//       perror("write err");
//       exit(-1);
//    }
//    cout << "father send a msg" << endl;
//    close(fds[1]);
//    return 0;
//}

//#define FILENAME "bite"
//
//int main() {
//    FILE* fp = fopen(FILENAME, "w+");
//    if(fp == NULL) {
//        perror("fopen err");
//        exit(-1);
//    }
//    
//    char s[] = "linux so easy";
//    size_t size = strlen(s);
//    size_t n = fwrite(s, 1, size, fp);
//    if(n != size) {
//        perror("fwrite err");
//        fclose(fp);
//        exit(-1);
//    }
//    if(fseek(fp, 0, SEEK_SET) != 0) {
//        perror("fseek err");
//        fclose(fp);
//        exit(-1);
//    }
//    char buff[1024]{};
//    n = fread(buff, 1, size, fp);
//    if(n != size) {
//        if(ferror(fp)) {
//            perror("fread err");
//            fclose(fp);
//            exit(-1);
//        }
//        else {
//            printf("end of file\n");
//        }
//    }
//    buff[n] = 0;
//    printf("%s\n", buff);
//    fclose(fp);
//    return 0;
//}

//int main() {
//    int fd = open(FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0666);
//    if(fd == -1) {
//        perror("open file err");
//        exit(-1);
//    }
//    string s = "i like linux";
//    ssize_t n = write(fd, s.c_str(), s.size());
//    if(n == -1) {
//        perror("write fail");
//        exit(-1);
//    }
//    off_t offset = lseek(fd, 0, SEEK_SET);
//    if(offset == -1) {
//        perror("lseek err");
//        exit(-1);
//    }
//    char buff[1024]{};
//    n = read(fd, buff, sizeof(buff));
//    if(n == -1) {
//        perror("read fail");
//        exit(-1);
//    }
//    buff[n] = 0;
//    cout << buff << endl;
//    close(fd);
//    return 0;
//}
